// Es el paquete del proyecto java en donde se generará la clase
package ejemplocup; 

/* librería necesaria para importar la clase Symbol y 
  trabajar con los tokens que se especificarán más adelante
*/
import java_cup.runtime.Symbol; 


%% 
        // ***SECCIÓN DE OPCIONES Y DECLARACIONES*** //

//OPCIONES
%class AnalizadorLexico // Específicamos el nombre de la clase que se va a generar
%line //activamos el contador de líneas
%column //activamos el contador de columnas  
%cup//activamos la  compatibilidad con el analizador sintáctico (CUP).
   
//DECLARACIONES
%{

    //Generamos el mètodo symbol para capturar el tipo del token
    private Symbol symbol(int type) {
        return new Symbol(type, yyline, yycolumn);
    }
  
    /*Generamos otro método symbol esta vez para capturar el tipo junto con 
    el valor del token */
    private Symbol symbol(int type, Object value) {
        return new Symbol(type, yyline, yycolumn, value);
    }
%}

//Expresiones regulares
Salto = \r|\n|\r\n  //salto de línea para varios sistemas operativo
Espacio  = {Salto} | [ \t\f] //Puede ser un salto, una tabulacion o salto de página
Numero = 0 | [1-9][0-9]* // formar cadenas de números mediante cerraduda de Kleene


%%   
              //****** EXPRESIONES REGULARES *********

<YYINITIAL> { //YYINITIAL es el estado inicial del analizador lexico al escanear una expersión.
   

    // Regresa el token FINLINEA declarado en la clase sym //
    ";"                {  return symbol(sym.FINLINEA); }                      
    // Regresa el token KM declarado en la clase sym //
    "km"                {  System.out.print(" km ");return symbol(sym.KM); }

    "hm"                {  System.out.print(" hm ");return symbol(sym.HM); }

    "dam"                {  System.out.print(" dam ");return symbol(sym.DAM); }

    "m"                {  System.out.print(" m ");return symbol(sym.MT); }

    "dm"                {  System.out.print(" dm ");return symbol(sym.DM); }

    "cm"                {  System.out.print(" cm ");return symbol(sym.CM); }

    "mm"                {  System.out.print(" mm ");return symbol(sym.MM); }

    "kmc"                {  System.out.print(" kmc ");return symbol(sym.KM_C); }

    "hmc"                {  System.out.print(" hmc ");return symbol(sym.HM_C); }

    "damc"                {  System.out.print(" damc ");return symbol(sym.DAM_C); }

    "mc"                {  System.out.print(" mc ");return symbol(sym.MT_C); }    

    "dmc"                {  System.out.print(" dmc ");return symbol(sym.DM_C); }

    "cmc"                {  System.out.print(" cmc ");return symbol(sym.CM_C); }

    "mmc"                {  System.out.print(" mmc ");return symbol(sym.MM_C); }

    "convertirlong"      {  System.out.print(" convertirlong ");return symbol(sym.CONVERTIRLONG); }

    "convertirvol"       {  System.out.print(" convertirvol ");return symbol(sym.CONVERTIRVOL); }

    // Retorna el token NUMERO, y obtiene el valor de este con el método yytext()
    {Numero}             {   System.out.print(yytext());return symbol(sym.NUMERO, new Double(yytext())); }

    //No hace nada al encontrar el espacio
    {Espacio}            { /* ignora el espacio */ } 

}

/* Si el token contenido en la entrada no coincide con ninguna regla
    entonces se marca un token ilegal */
[^]           { System.err.println("Error: linea "+((yyline)+1)+", columna "+yycolumn+":caracter invalido <"+yytext()+">");}
                      



